package com.wjm.core;

import com.wjm.http.HttpRequest;
import com.wjm.http.HttpResponse;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 * Data:2022年08月03日
 * Author:wjm
 * Content:
 *
 *   负责与指定客户端HTTP交互
 *      该线程来与客户端交互的过程必须遵守HTTP协议要求，采取一问一答的方式进行，固定的解析步骤：
 *       1）解析请求【问】
 *       2）处理请求
 *       3）响应请求【答】
 *
 */
public class RequestHandle implements Runnable{
    //声明一个Socket变量
    private Socket socket;

    /**
     * 用来接收从WebServer传过来的socket，socket封装着每一个客户端发送过来的所有信息
     * @param socket 从WebServer传过来的socket
     */
    public RequestHandle(Socket socket){
        this.socket = socket;
    }


    @Override
    public void run() {
        //1.解析请求
        HttpRequest httpRequest= new HttpRequest(socket);



        //2.处理请求
        String url = httpRequest.getUrl();

        /*
            ./webapps/ 可以认为是一个存放所以资源的文件夹，当需要某个应用的资源文件时，就可以在webapps下面查找
            要求客户端在输入请求资源时，一并输入应用的名称，例如：
                  应用是找：myweb
                  资源是找：index.html
                  客户端发送的请求是：http://localhost:8080/myweb/index.html
        * */
        File file = new File("./webapps"+url);

        //判断资源是否存在，并且是否为文件夹
        if (file.exists() && file.isFile()){//如果是就将客户端所需的资源返回
            //创建HttpResponse对象，并传入socket
            HttpResponse httpResponse = new HttpResponse(socket);
            //将文件资源对象传给HttpResponse
            httpResponse.setFileEntity(file);
            //发送响应
            httpResponse.flush();
            System.out.println("数据响应完毕！");

        }else {
            //如果不符合则返回404页面
            file = new File("./webapps/commons/404.html");
            //创建HttpResponse对象，并传入socket
            HttpResponse httpResponse = new HttpResponse(socket);
            //将文件资源对象传给HttpResponse
            httpResponse.setFileEntity(file);
            //设置状态码
            httpResponse.setStatusCode(404);
            //设置状态说明
            httpResponse.setStatusReason("NOT FOUND");
            //发送响应
            httpResponse.flush();
            System.out.println("404页面数据响应完毕！");

        }
        try {
            //每次响应完毕，关闭流来释放资源，提高效率
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


    }






}
